home *** CD-ROM | disk | FTP | other *** search
- /*
- dshell v3
-
- 文字列式評価
- */
-
- #include "dsh.h"
- #include <setjmp.h>
-
- static jmp_buf toAbort;
- static uchar *pp;
-
- #define skipBlank(x) ({ \
- uchar *_p = (x), _c; \
- while ((_c = *_p++) == '\x20' || _c == '\t') \
- ; \
- _p - 1; \
- }) \
-
-
- static volatile void evalError(void)
- {
- longjmp(toAbort, -1);
- }
-
- static int evalOR(void);
- static int evalCMP(void)
- {
- int val;
- uchar c1, c2, *s1, *s2, *e1, *e2, *p;
- uchar cond;
- enum {
- condLT, condLE, condEQ, condNE, condGE, condGT,
- };
-
- p = skipBlank(pp);
- c1 = *p++;
- if (c1 == '\0' || iskanji1(c1))
- evalError();
- if (c1 == '(') {
- pp = p;
- val = evalOR();
- p = skipBlank(pp);
- if (*p++ != ')')
- evalError();
- pp = p;
- return val;
- }
- if (c1 == '.' && strnEqu(p + 1, "not.", 4)) {
- pp = p + 5;
- return !evalOR();
- }
- s1 = p;
- p += dinstrchr(p, c1);
- if (p == s1)
- evalError();
- e1 = p;
- p = skipBlank(p);
-
- if (*p++ != '.')
- evalError();
- if (strnEqu(p, "lt.", 3))
- cond = condLT;
- else if (strnEqu(p, "le.", 3))
- cond = condLE;
- else if (strnEqu(p, "eq.", 3))
- cond = condEQ;
- else if (strnEqu(p, "ne.", 3))
- cond = condNE;
- else if (strnEqu(p, "ge.", 3))
- cond = condGE;
- else if (strnEqu(p, "gt.", 3))
- cond = condGT;
- else
- evalError();
- p = skipBlank(p + 3);
-
- c2 = *p++;
- if (c2 == '\0' || iskanji1(c2))
- evalError();
- s2 = p;
- p += dinstrchr(p, c2);
- if (p == s2)
- evalError();
- e2 = p;
- pp = p;
- *--e1 = '\0';
- *--e2 = '\0';
- val = strcmp(s1, s2);
- *e1 = c1;
- *e2 = c2;
-
- switch (cond) {
- case condLT:
- val = (val < 0);
- break;
- case condLE:
- val = (val <= 0);
- break;
- case condEQ:
- val = (val == 0);
- break;
- case condNE:
- val = (val != 0);
- break;
- case condGE:
- val = (val >= 0);
- break;
- case condGT:
- val = (val > 0);
- break;
- }
- return val;
- }
-
-
- static int evalAND(void)
- {
- uchar *p;
- int val;
-
- val = evalCMP();
- p = pp;
- for (;;) {
- p = skipBlank(p);
- if (*p == '.' && strnEqu(p + 1, "and.", 4)) {
- pp = p + 5;
- val &= evalCMP();
- p = pp;
- } else
- break;
- }
- return val;
- }
-
-
- static int evalOR(void)
- {
- uchar *p;
- int val;
-
- val = evalAND();
- p = pp;
- for (;;) {
- p = skipBlank(p);
- if (*p == '.' && strnEqu(p + 1, "or.", 3)) {
- pp = p + 4;
- val |= evalAND();
- p = pp;
- } else
- break;
- }
- return val;
- }
-
-
- int evalCond(uchar *p)
- {
- if (setjmp(toAbort) != 0)
- return -1;
- pp = p;
- return evalOR();
- }
-